package pe.com.bbva.modpre.ui;

import java.math.BigDecimal;
import java.util.Calendar;

import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.math.NumberUtils;
import org.drools.RuleBase;
import org.springframework.beans.factory.annotation.Autowired;

import pe.com.bbva.modpre.dominio.AreaCentral;
import pe.com.bbva.modpre.dominio.Cliente;
import pe.com.bbva.modpre.dominio.Finanza;
import pe.com.bbva.modpre.dominio.GrupoProducto;
import pe.com.bbva.modpre.dominio.MedioPago;
import pe.com.bbva.modpre.dominio.Operacion;
import pe.com.bbva.modpre.dominio.Producto;
import pe.com.bbva.modpre.dominio.RiesgoMotor;
import pe.com.bbva.modpre.dominio.Segmento;
import pe.com.bbva.modpre.dominio.Sistema;
import pe.com.bbva.modpre.dominio.TipoBanca;
import pe.com.bbva.modpre.dominio.Valor;
import pe.com.bbva.modpre.dominio.VigenciaTasa;
import pe.com.bbva.modpre.dominio.drools.Motor;
import pe.com.bbva.modpre.negocio.CalculoService;
import pe.com.bbva.modpre.negocio.SolicitudService;
import pe.com.bbva.modpre.utileria.Inject;
import pe.com.bbva.modpre.utileria.ModpreUtil;

import com.vaadin.annotations.AutoGenerated;
import com.vaadin.event.FieldEvents.TextChangeEvent;
import com.vaadin.event.FieldEvents.TextChangeListener;
import com.vaadin.ui.Alignment;
import com.vaadin.ui.Button;
import com.vaadin.ui.AbstractTextField.TextChangeEventMode;
import com.vaadin.ui.Button.ClickEvent;
import com.vaadin.ui.Button.ClickListener;
import com.vaadin.ui.CheckBox;
import com.vaadin.ui.ComboBox;
import com.vaadin.ui.CustomComponent;
import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.Label;
import com.vaadin.ui.PopupDateField;
import com.vaadin.ui.Table;
import com.vaadin.ui.TextField;
import com.vaadin.ui.VerticalLayout;

@SuppressWarnings("serial")
public class CalculadoraVerificarUI extends CustomComponent {

	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */

	@AutoGenerated
	private HorizontalLayout mainLayout;
	@AutoGenerated
	private HorizontalLayout mainLayoutContainer;
	@AutoGenerated
	private VerticalLayout lytContenido;
	@AutoGenerated
	private HorizontalLayout lytBoton;
	@AutoGenerated
	private Button btnAceptar;
	@AutoGenerated
	private HorizontalLayout lytRAR;
	@AutoGenerated
	private TextField txtRAR;
	@AutoGenerated
	private Label lblRAR;
	@AutoGenerated
	private HorizontalLayout lytTEA;
	@AutoGenerated
	private TextField txtTEA;
	@AutoGenerated
	private Label lblTEA;
	
	@Autowired
	protected SolicitudService solicitudService;
	@Autowired
	protected CalculoService calculoService;
	
	private Table tblOperacion;
	private int con;
	private TipoBanca tipoBanca;
	private Cliente cliente;
	private RiesgoMotor riesgoMotor;
	private AreaCentral areaCentral;
	private Sistema sistema;
	private MedioPago medioPago;
	private Finanza finanza;
	private Segmento segmento;
	private String ingreso;
	private RuleBase ruleBase;
	/**
	 * The constructor should first build the main layout, set the
	 * composition root and then do any custom initialization.
	 *
	 * The constructor will not be automatically regenerated by the
	 * visual editor.
	 */
	public CalculadoraVerificarUI(Table tblOperacion, int con, TipoBanca tipoBanca, Cliente cliente,RiesgoMotor riesgoMotor,
			AreaCentral areaCentral,Sistema sistema,MedioPago medioPago,Finanza finanza, Segmento segmento, String ingreso,RuleBase ruleBase) {
		buildMainLayout();
		setCompositionRoot(mainLayout);
		this.tblOperacion=tblOperacion;
		this.con=con;
		this.tipoBanca=tipoBanca;
		this.cliente=cliente;
		this.riesgoMotor=riesgoMotor;
		this.areaCentral=areaCentral;
		this.sistema=sistema;
		this.medioPago=medioPago;
		this.finanza=finanza;
		this.segmento=segmento;
		this.ingreso=ingreso;
		this.ruleBase=ruleBase;
		Inject.inject(this);
		postConstruct();
	}

	public void postConstruct() {
		txtTEA.setStyleName("decimal");
		txtTEA.setTextChangeEventMode(TextChangeEventMode.LAZY);
		txtTEA.setNullRepresentation(StringUtils.EMPTY);
		txtTEA.addListener(new TextChangeListener() {
			
			@Override
			public void textChange(TextChangeEvent event) {
				obtenerRar(con,event);
				txtTEA.focus();
			}
		});

		txtRAR.setStyleName("decimal");
		txtRAR.setTextChangeEventMode(TextChangeEventMode.LAZY);
		txtRAR.setNullRepresentation(StringUtils.EMPTY);
		txtRAR.addListener(new TextChangeListener() {
			
			@Override
			public void textChange(TextChangeEvent event) {
				obtenerTEA(con,event);
				txtTEA.focus();
			}
		});
		
		btnAceptar.addListener(new ClickListener() {
			
			@Override
			public void buttonClick(ClickEvent event) {
				TextField tea=(TextField)tblOperacion.getItem(con).getItemProperty("teaDictaminar").getValue();
				tea.setValue(txtTEA.getValue());
				tblOperacion.getItem(con).getItemProperty("rarDictaminar").setValue(txtRAR.getValue());
				if(StringUtils.isNotBlank((String)txtTEA.getValue())){
					ComboBox cmbProducto=(ComboBox)tblOperacion.getItem(con).getItemProperty("producto").getValue();
					Producto producto=(Producto)cmbProducto.getValue();
					Operacion operacion=new Operacion();
					operacion.setProducto(producto);
					PopupDateField pdfVechaFigencia=
							(PopupDateField)tblOperacion.getItem(con).getItemProperty("vigencia").getValue();
					VigenciaTasa vigenciaTasa=solicitudService.obtenerVigenciaxProducto(operacion);
					if(vigenciaTasa!=null){
						Calendar fecha=Calendar.getInstance();
						fecha.add(Calendar.DAY_OF_MONTH, vigenciaTasa.getVigencia());
						pdfVechaFigencia.setValue(fecha.getTime());
					}
				}
				getApplication().getMainWindow().getWindow().removeWindow(getWindow());
			}
		});		
	}

	public void obtenerTEA(Object itemId, TextChangeEvent event){
		if(tblOperacion.getItem(itemId)!=null && NumberUtils.isNumber(event.getText())){
			String rar=event.getText();
			ComboBox cmbProducto=(ComboBox)tblOperacion.getItem(itemId).getItemProperty("producto").getValue();
			ComboBox cmbMoneda=(ComboBox)tblOperacion.getItem(itemId).getItemProperty("moneda").getValue();
			TextField txtMontoCredito=(TextField)tblOperacion.getItem(itemId).getItemProperty("montoCredito").getValue();
			TextField txtPlazo=(TextField)((HorizontalLayout)tblOperacion.getItem(itemId).getItemProperty("plazo").getValue()).getComponent(0);
			String montoCredito=ModpreUtil.convertirMonto((String)txtMontoCredito.getValue());
			String plazo=(String)txtPlazo.getValue();
			ComboBox cmbTipoPlazo=(ComboBox)((HorizontalLayout)tblOperacion.getItem(itemId).getItemProperty("plazo").getValue()).getComponent(1);
			cliente.setSegmento(segmento);
			if(tipoBanca.getCodigo().equals(TipoBanca.CODIGO.BEC)){
				ComboBox cmbTipoOperacion=(ComboBox)tblOperacion.getItem(itemId).getItemProperty("tipoOperacion").getValue();
				if(cmbTipoOperacion.getValue()!=null && cmbProducto.getValue()!=null && cmbMoneda.getValue()!=null &&  
					NumberUtils.isNumber(montoCredito) &&
					StringUtils.isNotBlank(plazo) && 
					StringUtils.isNumeric(plazo) && cmbTipoPlazo.getValue()!=null){
					//Logica Motor de Reglas
					Operacion operacion=new Operacion();
					operacion.setProducto((Producto)cmbProducto.getValue());
					operacion.setMoneda((Valor)cmbMoneda.getValue());
					operacion.setMontoCredito(new BigDecimal(montoCredito));
					operacion.setPlazo(new BigDecimal(plazo));
					operacion.setTipoPlazo((Valor)cmbTipoPlazo.getValue());
					Motor motor=calculoService.calcularTeaRarBEC(cliente, operacion, areaCentral, finanza, 
							medioPago, riesgoMotor, sistema, tipoBanca, segmento, new BigDecimal(rar),ruleBase);
					if(motor.getTea()!=null){
						txtTEA.setValue(ModpreUtil.visualizarMontoBandeja(motor.getTea()));
					}else{
						txtTEA.setValue(null);
					}
				}else{
					txtTEA.setValue(null);
				}
			}
			if(tipoBanca.getCodigo().equals(TipoBanca.CODIGO.PARTICULAR)){
				TextField txtPrecioBien =(TextField)tblOperacion.getItem(itemId).getItemProperty("precioBien").getValue();
				String precioBien=ModpreUtil.convertirMonto((String)txtPrecioBien.getValue());
				TextField txtCuotaInicial =(TextField)tblOperacion.getItem(itemId).getItemProperty("cuotaInicial").getValue();
				String cuotaInicial=ModpreUtil.convertirMonto((String)txtCuotaInicial.getValue());
				CheckBox nroPropiedad=(CheckBox)tblOperacion.getItem(itemId).getItemProperty("nroPropiedad").getValue();
				Producto producto=(Producto)cmbProducto.getValue();
				if(cmbProducto.getValue()!=null && cmbMoneda.getValue()!=null &&  
					NumberUtils.isNumber(montoCredito) &&
					NumberUtils.isDigits(plazo) && cmbTipoPlazo.getValue()!=null 
					&& producto.getGrupoProducto().getCodigo().equals(GrupoProducto.CODIGO.CONSUMO)
					){
					//Logica Motor de Reglas
					Operacion operacion=new Operacion();
					operacion.setProducto((Producto)cmbProducto.getValue());
					operacion.setMoneda((Valor)cmbMoneda.getValue());
					operacion.setMontoCredito(new BigDecimal(montoCredito));
					operacion.setPlazo(new BigDecimal(plazo));
					operacion.setTipoPlazo((Valor)cmbTipoPlazo.getValue());
					Motor motor=null;
					BigDecimal ingresoMonto=null;
					if(NumberUtils.isNumber(ingreso)){
						ingresoMonto=new BigDecimal(ingreso);
					}
					motor=calculoService.calcularTeaRarConsumo(cliente, operacion, areaCentral, finanza, 
						medioPago, riesgoMotor, sistema, cliente.getDoi(), ingresoMonto,tipoBanca, new BigDecimal(rar),ruleBase);
					if(motor.getTea()!=null){
						txtTEA.setValue(ModpreUtil.visualizarMontoBandeja(motor.getTea()));
					}else{
						txtTEA.setValue(null);
					}
				}else if(cmbProducto.getValue()!=null && cmbMoneda.getValue()!=null &&  
						NumberUtils.isNumber(montoCredito) &&
						NumberUtils.isDigits(plazo) &&  cmbTipoPlazo.getValue()!=null 
						&& NumberUtils.isNumber(precioBien)
						&& NumberUtils.isNumber(cuotaInicial)
						&& producto.getGrupoProducto().getCodigo().equals(GrupoProducto.CODIGO.HIPOTECARIO)
						){
					//Logica Motor de Reglas
					Operacion operacion=new Operacion();
					operacion.setProducto((Producto)cmbProducto.getValue());
					operacion.setMoneda((Valor)cmbMoneda.getValue());
					operacion.setMontoCredito(new BigDecimal(montoCredito));
					operacion.setPlazo(new BigDecimal(plazo));
					operacion.setTipoPlazo((Valor)cmbTipoPlazo.getValue());
					operacion.setPropiedad(nroPropiedad.booleanValue());
					operacion.setPrecioBien(new BigDecimal(precioBien));
					Motor motor=null;
					BigDecimal ingresoMonto=null;
					if(NumberUtils.isNumber(ingreso)){
						ingresoMonto=new BigDecimal(ingreso);
					}
					motor=calculoService.calcularTeaRarHipotecario(cliente, operacion, areaCentral, finanza, 
							medioPago, riesgoMotor, sistema, cliente.getDoi(), ingresoMonto, tipoBanca, new BigDecimal(rar),ruleBase);
					if(motor.getTea()!=null){
						txtTEA.setValue(ModpreUtil.visualizarMontoBandeja(motor.getTea()));
					}else{
						txtTEA.setValue(null);
					}
				}else{
					txtTEA.setValue(null);
				}
			}
		}else{
			txtTEA.setValue(null);
		}
	}
	
	public void obtenerRar(Object itemId, TextChangeEvent event){
		if(tblOperacion.getItem(itemId)!=null && NumberUtils.isNumber(event.getText())){
			String tea=event.getText();
			ComboBox cmbProducto=(ComboBox)tblOperacion.getItem(itemId).getItemProperty("producto").getValue();
			ComboBox cmbMoneda=(ComboBox)tblOperacion.getItem(itemId).getItemProperty("moneda").getValue();
			TextField txtMontoCredito=(TextField)tblOperacion.getItem(itemId).getItemProperty("montoCredito").getValue();
			TextField txtPlazo=(TextField)((HorizontalLayout)tblOperacion.getItem(itemId).getItemProperty("plazo").getValue()).getComponent(0);
			String montoCredito=ModpreUtil.convertirMonto((String)txtMontoCredito.getValue());
			String plazo=(String)txtPlazo.getValue();
			ComboBox cmbTipoPlazo=(ComboBox)((HorizontalLayout)tblOperacion.getItem(itemId).getItemProperty("plazo").getValue()).getComponent(1);
			cliente.setSegmento(segmento);
			if(tipoBanca.getCodigo().equals(TipoBanca.CODIGO.BEC)){
				ComboBox cmbTipoOperacion=(ComboBox)tblOperacion.getItem(itemId).getItemProperty("tipoOperacion").getValue();
				if(cmbTipoOperacion.getValue()!=null && cmbProducto.getValue()!=null && cmbMoneda.getValue()!=null &&  
					NumberUtils.isNumber(montoCredito) &&
					StringUtils.isNotBlank(plazo) && 
					StringUtils.isNumeric(plazo) && cmbTipoPlazo.getValue()!=null){
					//Logica Motor de Reglas
					Operacion operacion=new Operacion();
					operacion.setProducto((Producto)cmbProducto.getValue());
					operacion.setMoneda((Valor)cmbMoneda.getValue());
					operacion.setMontoCredito(new BigDecimal(montoCredito));
					operacion.setPlazo(new BigDecimal(plazo));
					operacion.setTipoPlazo((Valor)cmbTipoPlazo.getValue());
					Motor motor=calculoService.calcularRarTeaBEC(cliente, operacion, areaCentral, finanza, 
							medioPago, riesgoMotor, sistema, tipoBanca, segmento, new BigDecimal(tea),ruleBase);
					if(motor.getRar()!=null){
						txtRAR.setValue(ModpreUtil.visualizarMontoBandeja(motor.getRar()));
					}else{
						txtRAR.setValue(null);
					}
				}else{
					txtRAR.setValue(null);
				}
			}
			if(tipoBanca.getCodigo().equals(TipoBanca.CODIGO.PARTICULAR)){
				TextField txtPrecioBien =(TextField)tblOperacion.getItem(itemId).getItemProperty("precioBien").getValue();
				String precioBien=ModpreUtil.convertirMonto((String)txtPrecioBien.getValue());
				TextField txtCuotaInicial =(TextField)tblOperacion.getItem(itemId).getItemProperty("cuotaInicial").getValue();
				String cuotaInicial=ModpreUtil.convertirMonto((String)txtCuotaInicial.getValue());
				CheckBox nroPropiedad=(CheckBox)tblOperacion.getItem(itemId).getItemProperty("nroPropiedad").getValue();
				Producto producto=(Producto)cmbProducto.getValue();
				if(cmbProducto.getValue()!=null && cmbMoneda.getValue()!=null &&  
					NumberUtils.isNumber(montoCredito) &&
					NumberUtils.isDigits(plazo) && cmbTipoPlazo.getValue()!=null 
					&& producto.getGrupoProducto().getCodigo().equals(GrupoProducto.CODIGO.CONSUMO)
					){
					//Logica Motor de Reglas
					Operacion operacion=new Operacion();
					operacion.setProducto((Producto)cmbProducto.getValue());
					operacion.setMoneda((Valor)cmbMoneda.getValue());
					operacion.setMontoCredito(new BigDecimal(montoCredito));
					operacion.setPlazo(new BigDecimal(plazo));
					operacion.setTipoPlazo((Valor)cmbTipoPlazo.getValue());
					Motor motor=null;
					BigDecimal ingresoMonto=null;
					if(NumberUtils.isNumber(ingreso)){
						ingresoMonto=new BigDecimal(ingreso);
					}
					motor=calculoService.calcularRarTeaConsumo(cliente, operacion, areaCentral, finanza, 
						medioPago, riesgoMotor, sistema, cliente.getDoi(), ingresoMonto,tipoBanca, new BigDecimal(tea),ruleBase);
					if(motor.getRar()!=null){
						txtRAR.setValue(ModpreUtil.visualizarMontoBandeja(motor.getRar()));
					}else{
						txtRAR.setValue(null);
					}
				}else if(cmbProducto.getValue()!=null && cmbMoneda.getValue()!=null &&  
						NumberUtils.isNumber(montoCredito) &&
						NumberUtils.isDigits(plazo) &&  cmbTipoPlazo.getValue()!=null 
						&& NumberUtils.isNumber(precioBien)
						&& NumberUtils.isNumber(cuotaInicial)
						&& producto.getGrupoProducto().getCodigo().equals(GrupoProducto.CODIGO.HIPOTECARIO)
						){
					//Logica Motor de Reglas
					Operacion operacion=new Operacion();
					operacion.setProducto((Producto)cmbProducto.getValue());
					operacion.setMoneda((Valor)cmbMoneda.getValue());
					operacion.setMontoCredito(new BigDecimal(montoCredito));
					operacion.setPlazo(new BigDecimal(plazo));
					operacion.setTipoPlazo((Valor)cmbTipoPlazo.getValue());
					operacion.setPropiedad(nroPropiedad.booleanValue());
					operacion.setPrecioBien(new BigDecimal(precioBien));
					Motor motor=null;
					BigDecimal ingresoMonto=null;
					if(NumberUtils.isNumber(ingreso)){
						ingresoMonto=new BigDecimal(ingreso);
					}
					motor=calculoService.calcularRarTeaHipotecario(cliente, operacion, areaCentral, finanza, 
							medioPago, riesgoMotor, sistema, cliente.getDoi(), ingresoMonto, tipoBanca, new BigDecimal(tea),ruleBase);
					if(motor.getRar()!=null){
						txtRAR.setValue(ModpreUtil.visualizarMontoBandeja(motor.getRar()));
					}else{
						txtRAR.setValue(null);
					}
				}else{
					txtRAR.setValue(null);
				}
			}
		}else{
			txtRAR.setValue(null);
		}
	}
	
	@AutoGenerated
	private HorizontalLayout buildMainLayout() {
		// common part: create layout
		mainLayout = new HorizontalLayout();
		mainLayout.setImmediate(false);
		mainLayout.setWidth("100%");
		mainLayout.setHeight("100%");
		mainLayout.setMargin(false);
		
		// top-level component properties
		setWidth("100.0%");
		setHeight("100.0%");
		
		// mainLayoutContainer
		mainLayoutContainer = buildMainLayoutContainer();
		mainLayout.addComponent(mainLayoutContainer);
		
		return mainLayout;
	}

	@AutoGenerated
	private HorizontalLayout buildMainLayoutContainer() {
		// common part: create layout
		mainLayoutContainer = new HorizontalLayout();
		mainLayoutContainer.setImmediate(false);
		mainLayoutContainer.setWidth("-1px");
		mainLayoutContainer.setHeight("-1px");
		mainLayoutContainer.setMargin(true);
		mainLayoutContainer.setSpacing(true);
		
		// lytContenido
		lytContenido = buildLytContenido();
		mainLayoutContainer.addComponent(lytContenido);
		
		return mainLayoutContainer;
	}

	@AutoGenerated
	private VerticalLayout buildLytContenido() {
		// common part: create layout
		lytContenido = new VerticalLayout();
		lytContenido.setImmediate(false);
		lytContenido.setWidth("-1px");
		lytContenido.setHeight("-1px");
		lytContenido.setMargin(false);
		lytContenido.setSpacing(true);
		
		// lytTEA
		lytTEA = buildLytTEA();
		lytContenido.addComponent(lytTEA);
		
		// lytRAR
		lytRAR = buildLytRAR();
		lytContenido.addComponent(lytRAR);
		
		// lytBoton
		lytBoton = buildLytBoton();
		lytContenido.addComponent(lytBoton);
		lytContenido.setComponentAlignment(lytBoton, new Alignment(20));
		
		return lytContenido;
	}

	@AutoGenerated
	private HorizontalLayout buildLytTEA() {
		// common part: create layout
		lytTEA = new HorizontalLayout();
		lytTEA.setImmediate(false);
		lytTEA.setWidth("-1px");
		lytTEA.setHeight("-1px");
		lytTEA.setMargin(false);
		lytTEA.setSpacing(true);
		
		// lblTEA
		lblTEA = new Label();
		lblTEA.setImmediate(false);
		lblTEA.setWidth("50px");
		lblTEA.setHeight("-1px");
		lblTEA.setValue("TEA :");
		lytTEA.addComponent(lblTEA);
		
		// txtTEA
		txtTEA = new TextField();
		txtTEA.setImmediate(false);
		txtTEA.setWidth("100px");
		txtTEA.setHeight("-1px");
		lytTEA.addComponent(txtTEA);
		
		return lytTEA;
	}

	@AutoGenerated
	private HorizontalLayout buildLytRAR() {
		// common part: create layout
		lytRAR = new HorizontalLayout();
		lytRAR.setImmediate(false);
		lytRAR.setWidth("-1px");
		lytRAR.setHeight("-1px");
		lytRAR.setMargin(false);
		lytRAR.setSpacing(true);
		
		// lblRAR
		lblRAR = new Label();
		lblRAR.setImmediate(false);
		lblRAR.setWidth("50px");
		lblRAR.setHeight("-1px");
		lblRAR.setValue("RAR :");
		lytRAR.addComponent(lblRAR);
		
		// txtRAR
		txtRAR = new TextField();
		txtRAR.setImmediate(false);
		txtRAR.setWidth("100px");
		txtRAR.setHeight("-1px");
		lytRAR.addComponent(txtRAR);
		
		return lytRAR;
	}

	@AutoGenerated
	private HorizontalLayout buildLytBoton() {
		// common part: create layout
		lytBoton = new HorizontalLayout();
		lytBoton.setImmediate(false);
		lytBoton.setWidth("-1px");
		lytBoton.setHeight("-1px");
		lytBoton.setMargin(false);
		
		// btnAceptar
		btnAceptar = new Button();
		btnAceptar.setCaption("Aceptar");
		btnAceptar.setImmediate(true);
		btnAceptar.setWidth("-1px");
		btnAceptar.setHeight("-1px");
		lytBoton.addComponent(btnAceptar);
		
		return lytBoton;
	}

}
